﻿#pragma once

#include "qcustomplot.h"
#include <QMouseEvent>
#include <QWheelEvent>

class CustomPlot : public QCustomPlot
{
	Q_OBJECT
public:
	CustomPlot(QWidget *parent = nullptr) : QCustomPlot(parent), isDragging(false) {};

protected:
	void mousePressEvent(QMouseEvent *event) override
	{
		if (event->button() == Qt::LeftButton)
		{
			// 记录鼠标按下时的坐标和当前的横坐标轴范围
			dragStartPos = event->pos();
			dragStartRange = xAxis->range();
			isDragging = true;
		}
		else
		{
			// 如果不是左键按下，则将事件传递给父类处理
			QCustomPlot::mousePressEvent(event);
		}
	}

	void mouseMoveEvent(QMouseEvent *event) override
	{
		if (isDragging)
		{
			// 计算鼠标的位移
			QPoint delta = event->pos() - dragStartPos;

			// 计算新的横坐标轴范围
			double xRangeLower = dragStartRange.lower - delta.x() * dragScaleFactor;
			double xRangeUpper = dragStartRange.upper - delta.x() * dragScaleFactor;

			// 限制横坐标轴范围在合理的范围内
			if (xRangeLower < 0)
			{
				xRangeLower = 0;
				xRangeUpper = dragStartRange.size();
			}

			// 设置新的横坐标轴范围
			xAxis->setRange(xRangeLower, xRangeUpper);

			// 重新绘制图形
			replot();
		}
		else
		{
			// 如果没有在拖动，则将事件传递给父类处理
			QCustomPlot::mouseMoveEvent(event);
		}
	}

	void mouseReleaseEvent(QMouseEvent *event) override
	{
		if (event->button() == Qt::LeftButton)
		{
			// 停止拖动
			isDragging = false;
		}
		else
		{
			// 如果不是左键释放，则将事件传递给父类处理
			QCustomPlot::mouseReleaseEvent(event);
		}
	}

	void wheelEvent(QWheelEvent *event) override
	{
		if (event->modifiers() & Qt::ControlModifier)
		{
			// 获取鼠标滚轮的滚动方向
			int delta = event->angleDelta().y();

			// 根据滚动方向进行缩放
			double scaleFactor = 1.1;
			if (delta < 0)
				scaleFactor = 1.0 / scaleFactor;

			// 获取当前横坐标轴的范围
			QCPRange xRange = xAxis->range();

			// 计算缩放后的横坐标轴范围
			double newLower = xRange.lower + (xRange.upper - xRange.lower) / 2.0 * (1 - scaleFactor);
			double newUpper = xRange.upper - (xRange.upper - xRange.lower) / 2.0 * (1 - scaleFactor);

			// 设置新的横坐标轴范围
			xAxis->setRange(newLower, newUpper);

			// 重新绘制图形
			replot();
		}
		else
		{
			// 如果没有按下 Ctrl 键，则将事件传递给父类处理
			QCustomPlot::wheelEvent(event);
		}
	}

private:
	bool isDragging;                 // 是否正在拖动坐标轴
	QPoint dragStartPos;             // 拖动开始时的鼠标位置
	QCPRange dragStartRange;         // 拖动开始时的横坐标轴范围
	const double dragScaleFactor = 0.5;  // 拖动时横坐标轴范围的缩放因子
};
